#ifndef __vector_H
#define __vector_H

#ifdef __cplusplus
extern "C" {
#endif

#include "Header.h"

#define __vector(x) __name(Vector, x)

#define __dvector(x) __begclass(Element##x)                                                                      \
	                    x * m##x[20];                                                                            \
	                    int mSize;                                                                               \
	                 __endclass                                                                                  \
	                 __begclass(Vector##x)                                                                       \
	                    Element##x * m##Element##x[20];                                                          \
					    int mSize;                                                                               \
	                 __endclass                                                                                  \
					 typedef void (*x##run_t)(void * _tObject, x * _t##x);                                       \
					 typedef bool (*x##find_t)(void * _tObject, x * _t##x);                                      \
					 __public void __begvoid(Element##x, initialize)                                             \
					 __endheader                                                                                 \
				     __public void __begvoid(Vector##x, initialize)                                              \
	                 __endheader                                                                                 \
		             __public void __begheader(Vector##x, pushBack)                                              \
		                 x * _t##x                                                                               \
				     __endheader                                                                                 \
                     __public void __begheader(Vector##x, foreach)                                               \
					     void * _tObject, x##run_t _t##x##run_t                                                  \
	                 __endheader                                                                                 \
					 __public bool __begheader(Vector##x, find)                                                  \
					     void * _tObject, x##find_t _t##x##find_t                                                \
					 __endheader

#define __bvector(x) void __begvoid(Element##x, initialize)                                                       \
                     __begbody                                                                                    \
					      for(int i = 0; i < 20; i++)                                                             \
	                      {                                                                                       \
	                          __this(Element##x)->m##x[i] = NULL;                                                 \
						  }                                                                                       \
					      __this(Element##x)->mSize = 0;                                                          \
				     __endbody                                                                                    \
					 void __begvoid(Vector##x, initialize)                                                        \
					 __begbody                                                                                    \
					      for(int i = 0; i < 20; i++)                                                             \
					      {                                                                                       \
					          __this(Vector##x)->m##Element##x[i] = NULL;                                         \
					      }                                                                                       \
					      __this(Vector##x)->mSize = 0;                                                           \
					 __endbody                                                                                    \
					 void __begheader(Vector##x, pushBack)                                                        \
					     x * _t##x                                                                                \
					 __begbody                                                                                    \
					     Element##x * element##x = __this(Vector##x)->m##Element##x[__this(Vector##x)->mSize];    \
						 if(NULL == element##x)                                                                   \
                         {                                                                                        \
						     element##x = (Element##x *)malloc(sizeof(Element##x));                               \
							 __this(Vector##x)->m##Element##x[__this(Vector##x)->mSize] = element##x;             \
							 __voidfun(element##x, Element##x, initialize)                                        \
                         }                                                                                        \
					     if ((element##x->mSize > 19) && (__this(Vector##x)->mSize > 19))                         \
	                     {                                                                                        \
	                         return;                                                                              \
                         }                                                                                        \
						 if (element##x->mSize > 19)                                                              \
					     {                                                                                        \
						     element##x = (Element##x *)malloc(sizeof(Element##x));                               \
						     __this(Vector##x)->m##Element##x[__this(Vector##x)->mSize] = element##x;             \
							 __voidfun(element##x, Element##x, initialize)                                        \
							 __this(Vector##x)->mSize++;                                                          \
                         }                                                                                        \
						 element##x->m##x[element##x->mSize] = _t##x;                                             \
						 element##x->mSize++;                                                                     \
					 __endbody                                                                                    \
					 void __begheader(Vector##x, foreach)                                                         \
	                     void * _tObject, x##run_t  _t##x##run_t                                                  \
	                 __begbody                                                                                    \
					     for(int i = 0; i <= __this(Vector##x)->mSize; i++)                                       \
	                     {                                                                                        \
	                         Element##x * element##x = __this(Vector##x)->m##Element##x[i];                       \
							 if (NULL == element##x)                                                              \
							 {                                                                                    \
								 continue;                                                                        \
							 }                                                                                    \
							 for (int j = 0; j < element##x->mSize; j++)                                          \
							 {                                                                                    \
								 _t##x##run_t(_tObject, element##x->m##x[j]);                                     \
							 }                                                                                    \
                         }                                                                                        \
					 __endbody                                                                                    \
					 bool __begheader(Vector##x, find)                                                            \
					     void * _tObject, x##find_t  _t##x##find_t                                                \
					 __begbody                                                                                    \
					     for(int i = 0; i <= __this(Vector##x)->mSize; i++)                                       \
	                     {                                                                                        \
	                         Element##x * element##x = __this(Vector##x)->m##Element##x[i];                       \
	                         if (NULL == element##x)                                                              \
	                         {                                                                                    \
	                             continue;                                                                        \
                             }                                                                                    \
	                         for (int j = 0; j < element##x->mSize; j++)                                          \
	                         {                                                                                    \
	                             bool status = _t##x##find_t(_tObject, element##x->m##x[j]);                      \
								 if (true == status)                                                              \
								 {                                                                                \
								     OutputDebugStringA("hello world!");                                          \
								     return true;                                                                 \
								 }                                                                                \
                             }                                                                                    \
                         }                                                                                        \
						 return false;                                                                            \
	                 __endbody

#define __foreach(x, y, z, k) __begfun(x, y, foreach)                                                             \
	                         z, k                                                                                 \
						 __endfun
#define __find(x, y, z, k) __begfun(x, y, find)                                                                   \
	                         z, k                                                                                 \
	                     __endfun
#ifdef __cplusplus
}
#endif
#endif // __vector_H
